<?php
session_start();
require_once '../model/Classe.php';

class ClasseDLO {

    private $classes;
    private static $classeDLO;

    private function __construct() {

    }

    /**
     * @method ThesaurusController getInstance() para obter uma única instância do controlador
     * @return ClasseDLO
     */
    public static function getInstance() {
        if (!isset(self::$classeDLO)) {
            if (!isset($_SESSION['classeDLO'])) {
                $_SESSION['classeDLO'] = serialize(new ClasseDLO());
            }
            self::$classeDLO = unserialize($_SESSION['classeDLO']);
        }
        return self::$classeDLO;
    }

    public function &listar(&$cod_classe_pai) {
        $result = &Classe::gerarArvore($cod_classe_pai);
        $resultado = array();
        for ($i = 0; $i < sizeof($result); $i++) {
            $row = array();
            $row['cod_classe'] = &$result[$i]->getCod_classe();
            $row['nome'] = &$result[$i]->getNome();
            $row['codigo'] = &$result[$i]->getCodigo();
            $row['descricao'] = &$result[$i]->getDescricao();
            $row['filhos'] = &$this->listarFilhos($result[$i]);
            $resultado[$i] = &$row;
            unset($row);
        }
        return $resultado;
    }

    private function &listarFilhos(Classe &$classe) {
        $result = &$classe->getClassesFilhas();
        $resultado = array();
        for ($i = 0; $i < sizeof($result); $i++) {
            $row = array();
            $row['cod_classe'] = &$result[$i]->getCod_classe();
            $row['nome'] = &$result[$i]->getNome();
            $row['codigo'] = &$result[$i]->getCodigo();
            $row['descricao'] = &$result[$i]->getDescricao();
            $row['filhos'] = &$this->listarFilhos($result[$i]);
            $resultado[$i] = &$row;
            unset($row);
        }
        return $resultado;
    }

    public function cadastrar(&$descricao, &$nome, $cod_classe_pai) {
        $classe = new Classe();
        if (!is_null($cod_classe_pai)) {
            $classePai = Classe::consultar($cod_classe_pai);
            $classe->setClasse_pai($classePai);
        }
        $classe->setDescricao($descricao);
        $classe->setNome($nome);        
        $classe->cadastrar();
    }

    public function alterar(&$cod_classe, &$campo_id, &$campo_valor) {
        $classe = null;
        if (isset($this->classes[$cod_classe])) {
            $classe = &$this->classes[$cod_classe];
        } else {
            $classe = &Classe::consultar($cod_classe);
            $this->classes[$cod_classe] = &$classe;
            $_SESSION['classeDLO'] = serialize($this);
        }
        $classe->alterarCampo($campo_id, $campo_valor);
        $this->classes[$cod_classe] = &$classe;
        $_SESSION['classeDLO'] = serialize($this);
    }

    public function excluir(&$Cod_Classe) {
        $classe = null;
        if (isset($this->classes[$Cod_Classe])) {
            $classe = &$this->classes[$Cod_Classe];
        } else {
            $classe = &Classe::consultar($Cod_Classe);
            $this->classes[$Cod_Classe] = &$classe;
            $_SESSION['classeDLO'] = serialize($this);
        }
        if ($classe->isVinculado() == 1) {
            throw new Exception("Recurso vinculado");
        }
        $classe->excluir();
        unset($this->classes[$Cod_Classe]);
        $_SESSION['classeDLO'] = serialize($this);
    }

    public function consultar(&$Cod_Classe) {
        $classe = null;
        if (isset($this->classes[$Cod_Classe])) {
            $classe = &$this->classes[$Cod_Classe];
        } else {
            $classe = &Classe::consultar($Cod_Classe);
            $this->classes[$Cod_Classe] = &$classe;
            $_SESSION['classeDLO'] = serialize($this);
        }
        $row = array();
        $row['cod_classe'] = &$classe->getCod_Classe();
        $row['nome'] = &$classe->getNome();
        $row['descricao'] = &$classe->getDescricao();
        $row['vinculado'] = &$classe->isVinculado();
        return $row;
    }

}
?>
